home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / whrandom.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  5KB  |  150 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. """Wichman-Hill random number generator.
  5.  
  6. Wichmann, B. A. & Hill, I. D. (1982)
  7. Algorithm AS 183:
  8. An efficient and portable pseudo-random number generator
  9. Applied Statistics 31 (1982) 188-190
  10.  
  11. see also:
  12.         Correction to Algorithm AS 183
  13.         Applied Statistics 33 (1984) 123
  14.  
  15.         McLeod, A. I. (1985)
  16.         A remark on Algorithm AS 183
  17.         Applied Statistics 34 (1985),198-200
  18.  
  19.  
  20. USE:
  21. whrandom.random()       yields double precision random numbers
  22.                         uniformly distributed between 0 and 1.
  23.  
  24. whrandom.seed(x, y, z)  must be called before whrandom.random()
  25.                         to seed the generator
  26.  
  27. There is also an interface to create multiple independent
  28. random generators, and to choose from other ranges.
  29.  
  30.  
  31.  
  32. Multi-threading note: the random number generator used here is not
  33. thread-safe; it is possible that nearly simultaneous calls in
  34. different theads return the same random value.  To avoid this, you
  35. have to use a lock around all calls.  (I didn't want to slow this
  36. down in the serial case by using a lock here.)
  37. """
  38. import warnings
  39. warnings.warn('the whrandom module is deprecated; please use the random module', DeprecationWarning)
  40.  
  41. class whrandom:
  42.     
  43.     def __init__(self, x = 0, y = 0, z = 0):
  44.         '''Initialize an instance.
  45.         Without arguments, initialize from current time.
  46.         With arguments (x, y, z), initialize from them.'''
  47.         self.seed(x, y, z)
  48.  
  49.     
  50.     def seed(self, x = 0, y = 0, z = 0):
  51.         '''Set the seed from (x, y, z).
  52.         These must be integers in the range [0, 256).'''
  53.         if type(y) == type(y) and type(z) == type(z):
  54.             pass
  55.         elif not type(z) == type(0):
  56.             raise TypeError, 'seeds must be integers'
  57.         
  58.         if x == x and y == y:
  59.             pass
  60.         elif y == z:
  61.             import time as time
  62.             t = long(time.time() * 256)
  63.             t = int(t & 16777215 ^ t >> 24)
  64.             (t, x) = divmod(t, 256)
  65.             (t, y) = divmod(t, 256)
  66.             (t, z) = divmod(t, 256)
  67.         
  68.         if not z:
  69.             pass
  70.         self._seed = (None, 1 if not x else 1, 1)
  71.  
  72.     
  73.     def random(self):
  74.         '''Get the next random number in the range [0.0, 1.0).'''
  75.         (x, y, z) = self._seed
  76.         x = 171 * x % 30269
  77.         y = 172 * y % 30307
  78.         z = 170 * z % 30323
  79.         self._seed = (x, y, z)
  80.         return (x / 30269.0 + y / 30307.0 + z / 30323.0) % 1.0
  81.  
  82.     
  83.     def uniform(self, a, b):
  84.         '''Get a random number in the range [a, b).'''
  85.         return a + (b - a) * self.random()
  86.  
  87.     
  88.     def randint(self, a, b):
  89.         '''Get a random integer in the range [a, b] including
  90.         both end points.
  91.  
  92.         (Deprecated; use randrange below.)'''
  93.         return self.randrange(a, b + 1)
  94.  
  95.     
  96.     def choice(self, seq):
  97.         '''Choose a random element from a non-empty sequence.'''
  98.         return seq[int(self.random() * len(seq))]
  99.  
  100.     
  101.     def randrange(self, start, stop = None, step = 1, int = int, default = None):
  102.         """Choose a random item from range(start, stop[, step]).
  103.  
  104.         This fixes the problem with randint() which includes the
  105.         endpoint; in Python this is usually not what you want.
  106.         Do not supply the 'int' and 'default' arguments."""
  107.         istart = int(start)
  108.         if istart != start:
  109.             raise ValueError, 'non-integer arg 1 for randrange()'
  110.         
  111.         if stop is default:
  112.             if istart > 0:
  113.                 return int(self.random() * istart)
  114.             
  115.             raise ValueError, 'empty range for randrange()'
  116.         
  117.         istop = int(stop)
  118.         if istop != stop:
  119.             raise ValueError, 'non-integer stop for randrange()'
  120.         
  121.         if step == 1:
  122.             if istart < istop:
  123.                 return istart + int(self.random() * (istop - istart))
  124.             
  125.             raise ValueError, 'empty range for randrange()'
  126.         
  127.         istep = int(step)
  128.         if istep != step:
  129.             raise ValueError, 'non-integer step for randrange()'
  130.         
  131.         if istep > 0:
  132.             n = ((istop - istart) + istep - 1) / istep
  133.         elif istep < 0:
  134.             n = ((istop - istart) + istep + 1) / istep
  135.         else:
  136.             raise ValueError, 'zero step for randrange()'
  137.         if n <= 0:
  138.             raise ValueError, 'empty range for randrange()'
  139.         
  140.         return istart + istep * int(self.random() * n)
  141.  
  142.  
  143. _inst = whrandom()
  144. seed = _inst.seed
  145. random = _inst.random
  146. uniform = _inst.uniform
  147. randint = _inst.randint
  148. choice = _inst.choice
  149. randrange = _inst.randrange
  150.